#ifndef LOG_H
# define LOG_H

#include <sys/time.h>
#include <sys/types.h>
#include <time.h>

// #include "stringutils.h"
#include "pctl.h"

#define LOG_INFO    FC_GREEN             "I" FC_DEFAULT
#define LOG_DEBUG   FC_BLUE              "D" FC_DEFAULT
#define LOG_WARNING FC_YELLOW            "W" FC_DEFAULT
#define LOG_ERROR   FC_RED               "E" FC_DEFAULT
#define LOG_FATAL   FB BC_GREEN FC C_BLUE "F" FC_DEFAULT
                    // 字背景颜色  字体颜色

// 05/13/2021 09:46:56
#define TIME_STAMP_FORMAT "%Y-%m-%d %H:%M:%S"

// Usage:
// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ char buffer[100]; │ │ timestamp(&buffer); │ │ printf("%s\n",buffer); │
// └──────────────────────────────────────────────────────────────────────────────┘
// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ 2021-07-28 14:42:37                                                          │
// └──────────────────────────────────────────────────────────────────────────────┘
void timestampf(char *buffer, char *format);
void timestamp(char *buffer);
void printflog(char *level, const char *format, ...);

// simple
void printlog(char *msg);
// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ [21-07-28 12:00:00.999] I - this is log info 1                               │
// │ [21-07-28 12:00:00.999] I - this is log info 2                               │
// │ [21-07-28 12:00:00.999] I - this is log info 3                               │
// │ [21-07-28 12:00:00.999] I - this is log info 4                               │
// └──────────────────────────────────────────────────────────────────────────────┘

#define INFO_LOG(fmt,argc...)  printflog(LOG_INFO, fmt, ##argc)
#define DEBUG_LOG(fmt,argc...) printflog(LOG_DEBUG, fmt, ##argc)
#define WARNING_LOG(fmt,argc...) printflog(LOG_WARNING, fmt, ##argc)
#define ERROR_LOG(fmt,argc...) printflog(LOG_ERROR, fmt, ##argc)
#define FATAL_LOG(fmt,argc...) printflog(LOG_FATAL, fmt, ##argc)

// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ va_list ap;                                                                  │
// │ va_start(ap, _fmt);                                                          │
// │ fprintf(stdout, FC_GREEN"\t[module] "FC_DEFAULT);                            │
// │ int erro = vprintf(_fmt, ap);                                                │
// │ va_end(ap);                                                                  │
// │ return erro;                                                                 │
// └──────────────────────────────────────────────────────────────────────────────┘

/*
 * module_print_log();
 */
// void module_print_log(char *level, char *module, const char *format, ...)
// {

//     pthread_mutex_lock(&fileMutex);

//     FILE *          fp = NULL;
//     va_list         vlist;
//     char *          fmt = NULL;
//     struct timeval  tv;
//     struct timezone tz;
//     time_t          timep;
//     struct tm *     ptm = NULL;

//     update_log_file_name();
//     // Open current output file.
//     if (!(fp = fopen(current_log, "a+")))
//     {
//         printf("module_print_log: open file error %d\n", errno);
//         pthread_mutex_unlock(&fileMutex);
//         return;
//     }

//     va_start(vlist, format);
//     safe_vasprintf(&fmt, format, vlist);
//     va_end(vlist);
//     if (!fmt)
//     {
//         printf("module_print_log: get time failed\n");
//         pthread_mutex_unlock(&fileMutex);
//         return;
//     }
//     gettimeofday(&tv, &tz);
//     time(&timep);
//     ptm = localtime(&timep);
//     fprintf(fp,
//             "%04d-%02d-%02d %02d:%02d:%02d.%03d  %s  %s:  %s",
//             ptm->tm_year + 1900,
//             ptm->tm_mon + 1,
//             ptm->tm_mday,
//             ptm->tm_hour,
//             ptm->tm_min,
//             ptm->tm_sec,
//             tv.tv_usec / 1000,
//             level,
//             module,
//             fmt);

//     free(fmt);
//     fsync(fileno(fp));
//     fclose(fp);

//     pthread_mutex_unlock(&fileMutex);
// }




#endif